//Implementación de las rutinas del servidor para aplicar desplazamiento (o codificación cesar).
#include "cesar.h"

void apply_key (char* dest, const char* orig, int key) {
	char delta = key%256;
	while ( (orig != NULL) && (*orig != '\0') ) {
		*dest = (*orig) + delta;
		++orig;
		++dest;
	}
	if (*orig == '\0');
		*dest = '\0';
}

retorno *
cypher_1_svc(char **argp, struct svc_req *rqstp)
{
	static retorno  result;

	char clave = argp[0][0];
	fprintf (stdout,"Servidor: cifrando \"%s\" con la clave %d.\n",&(argp[0][1]),clave);
	apply_key(&(result.retorno_u.message[0]),(*argp)+1,clave);
	result.cod_ret = 1;		

	return &result;
}

retorno *
uncypher_1_svc(char **argp, struct svc_req *rqstp)
{
	static retorno  result;

	char clave = argp[0][0];
	fprintf(stdout,"Servidor: descifrando \"%s\" con la clave %d.\n",&(argp[0][1]),clave);
	apply_key(&(result.retorno_u.message[0]),(*argp)+1,-clave);
	result.cod_ret = 1;

	return &result;
}

retorno *
cesar_1_svc(tMessageV2 *argp, struct svc_req *rqstp)
{
	static retorno  result;
	
	const char* pMessage = &(argp->message[0]);

	fprintf(stdout,"Servidor: aplicando clave %d a \"%s\".\n",argp->clave,pMessage);
	apply_key(&(result.retorno_u.message[0]),pMessage,argp->clave);	
	result.cod_ret = 1;
	return &result;
}
